'use strict';

const Controller = require('egg').Controller;

const pump = require('pump');
const fs = require('fs');
const path = require('path');
// 引入模块智能生成上传文件夹
const mkdirp = require('mkdirp');
// 引入格式化时间模块
const sd = require('silly-datetime');
class UploadController extends Controller {

  // 上传多个文件 mode: 'stream',
  async uploadmax() {
    const { ctx } = this;
    // autoFields: true 表示除了文件的其它字段
    const parts = ctx.multipart({ autoFields: true });
    let files = {},
      stream;
      // 循环获取数据流
    while ((stream = await parts()) != null) {
      if (!stream.filename) {
        break;// 多文件上传时，只能break,不能return
      }

      const fieldname = stream.fieldname; // // 文件表单的name
      const filename = stream.filename; // 上传文件名称

      // 获取上传文件路径与入库保存路径
      const dir = await ctx.helper.getUploadFile(filename);
      // 上传路径
      const target = dir.uploadDir;

      // 创建可写流 写入上传文件
      const writeStream = fs.createWriteStream(target);
      // 建立管道
      await pump(stream, writeStream);
      // 将多个上传图片统一拼接为一个对象，便于访问
      files = Object.assign(files, {
        [fieldname]: dir.saveDir,
      });
    }
    console.log('=====');
    if (Object.keys(files).length > 0) {
      ctx.helper.success('上传成功', files);
    } else {
      ctx.helper.error('上传失败');
    }
  }
  // 上传单文件 mode: 'stream',
  async uploadmin() {
    const { ctx } = this;

    let files = {};
    const stream = await this.ctx.getFileStream();

    const fieldname = stream.fieldname; // file表单的名字
    const filename = stream.filename; // 上传文件名称
    // 上传图片的目录
    const dir = await ctx.helper.getUploadFile(filename);
    // 存储地址
    const target = dir.uploadDir;
    // 创建可写流
    const writeStream = fs.createWriteStream(target);
    // 建立管道
    await pump(stream, writeStream);


    files = Object.assign(files, {
      [fieldname]: dir.saveDir,
    });

    if (Object.keys(files).length > 0) {
      ctx.helper.success('上传成功', files);
    } else {
      ctx.helper.error('上传失败');
    }
  }

  // file模式： // mode: 'file',
  async addHead() {
    const { ctx } = this;
    const file = ctx.request.files[0];
    const data = fs.readFileSync(file.filepath);
    const base64str = Buffer.from(data, 'binary').toString('base64');
    const bufferData = Buffer.from(base64str, 'base64');
    // 1、获取当前日期     20301024
    const day = sd.format(new Date(), 'YYYYMMDD');
    // 2、创建图片保存的路径 将存放地址与日期进行拼接）
    const dir = path.join(this.config.uploadDir, day);
    await mkdirp(dir); // 按dir去创建文件夹，如果没有则生成，如果有则忽略
    const date = Date.now(); /* 毫秒数*/// 获取当前时间戳
    // 返回图片保存的路径 (文件夹 + 时间戳 + 后辍名)
    const src = path.join(dir, date + path.extname(file.filename));
    try {
      await fs.writeFileSync(src, bufferData);
      ctx.body = { src: this.ctx.origin + src.slice(3).replace(/\\/g, '/') };
      ctx.status = 200;
    } catch (e) {
      ctx.body = { msg: '写入图片失败' };
      ctx.status = 400;
    }
  }

}


module.exports = UploadController;
